﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyNganHangDe.DAL;
using QuanLyNganHangDe.DAL.Models;
using QuanLyNganHangDe.GUI;

/**
 * HISTORY
 * 
 * 20140605-0510
 * # Sắp xếp theo thứ tự ABC của tên câu hỏi?
 */
namespace QuanLyNganHangDe.BLL
{
    /// <summary>
    /// Lớp xử lý nghiệp vụ liên quan đến câu hỏi
    /// </summary>
    partial class BizCauHoi
    {

        public static List<Khoi> GetListKhoi(string maCauHoi)
        {
            using (var db = new QLNHD_KHContext())
            {
                var ch = db.CauHoiDbSet.Where(e => e.MaCauHoi == maCauHoi).SingleOrDefault();
                if (ch != null)
                {
                    var hp = db.HocPhanDbSet.Where(e => e.MaHocPhan == ch.Khoi.HocPhan.MaHocPhan).SingleOrDefault();
                    if (hp != null)
                        if (hp.KhoiCollection != null && hp.KhoiCollection.Count > 0)
                            return hp.KhoiCollection.ToList();
                        else
                            return null;
                    else
                        throw new Exception("Không tồn tại học phần chứa câu hỏi này");
                }
                else
                    throw new Exception("Câu hỏi này không tồn tại");

            }
        }

        public static List<GridCauHoiForQuanLy> GeneralQuestion()
        {
            List<Khoi> dskhoi = new List<Khoi>();
            for (int i = 0; i < 5; i++)
            {
                Khoi khoi = new Khoi() { MaKhoi = i.ToString(), TenKhoi = "Khối " + i.ToString(), SoDiem = "2" };
                dskhoi.Add(khoi);
            }
            List<GridCauHoiForQuanLy> rs = new List<GridCauHoiForQuanLy>();
            int ma = 0;
            for (int i = 0; i < 5; i++)
                for (int j = 0; j < 5; j++)
                {
                    ma++;
                    GridCauHoiForQuanLy ch = new GridCauHoiForQuanLy() { MaCauHoi = i.ToString(), TenCauHoi = i.ToString() + j.ToString(), TenKhoi = dskhoi[i].TenKhoi, Diem = dskhoi[i].SoDiem, NoiDung = "Nội dung " + i.ToString() + j.ToString() };
                    rs.Add(ch);
                }
            return rs;
        }

        internal static int AddDSCauHoi(List<CauHoi> dsCauHoi, HocPhan hocPhan)
        {
            try
            {
                using (var context = QLNHD_KHContext.GetContext())
                {
                    foreach (var item in dsCauHoi)
                    {
                        var tenKhoi = item.Khoi.TenKhoi.Replace("\r", "").Replace("\n", "");
                        Khoi khoi = null;
                        var khoils = (from e in context.KhoiDbSet
                                      where
                                      e.MaHocPhan == hocPhan.MaHocPhan
                                      select e).ToList();
                        int i = 0;
                        for (i = 0; i < khoils.Count; i++)
                        {
                            if (khoils[i].TenKhoi.ToLower().Equals(tenKhoi.ToLower()))
                            {
                                khoi = khoils[i];
                                break;
                            }
                        }
                        if (khoils == null || khoils.Count == 0 || i == khoils.Count)
                            khoi = context.KhoiDbSet.Add(new Khoi { MaKhoi = Guid.NewGuid().ToString(), TenKhoi = tenKhoi, MaHocPhan = hocPhan.MaHocPhan, SoDiem = item.Khoi.SoDiem });
                        //khoi = new Khoi { MaKhoi = Guid.NewGuid().ToString(), TenKhoi = item.Khoi.TenKhoi, MaHocPhan = hocPhan.MaHocPhan, SoDiem = item.Khoi.SoDiem };
                        //item.MaCauHoi = Guid.NewGuid().ToString();
                        //item.MaKhoi = khoi.MaKhoi;
                        //item.NguoiSuDung = Program.NguoiSuDung;
                        CauHoi ch = new CauHoi
                        {
                            MaCauHoi = Guid.NewGuid().ToString(),
                            TenCauHoi = item.TenCauHoi,
                            NoiDungCauHoi_RTF = item.NoiDungCauHoi_RTF,
                            NoiDungCauHoi_Unicode = Trim250(item.NoiDungCauHoi_Unicode),
                            NoiDungTraLoi_RTF = item.NoiDungTraLoi_RTF,
                            NoiDungTraLoi_Unicode = Trim250(item.NoiDungTraLoi_Unicode),
                            MaKhoi = khoi.MaKhoi,
                            TenDangNhap = Program.NguoiSuDung == null ? "admin" : Program.NguoiSuDung.TenDangNhap,
                            ConSuDung = true
                        };
                        context.CauHoiDbSet.Add(ch);
                        context.SaveChanges();
                    }

                    return dsCauHoi.Count;
                }
            }
            catch
            {
                throw new Exception("Không thể thêm câu hỏi vào CSDL");
            }
        }
        static string Trim250(string str)
        {
            if (string.IsNullOrEmpty(str) || str.Length <= 247)
                return str;
            else
                return str.Substring(0, 247) + "...";
        }

        internal static int UpdateContent(string maCauHoi, string noiDung_RTF, string dapAn_RTF, string noiDung_Unicode, string dapAn_Unicode)
        {
            using (var db = new QLNHD_KHContext())
            {
                var cauHoi = db.CauHoiDbSet.Where(e => e.MaCauHoi == maCauHoi).SingleOrDefault();
                if (cauHoi == null)
                    return -1;
                else
                {
                    try
                    {
                        cauHoi.NoiDungCauHoi_RTF = noiDung_RTF;
                        cauHoi.NoiDungCauHoi_Unicode = Trim250(noiDung_Unicode);
                        cauHoi.NoiDungTraLoi_RTF = dapAn_RTF;
                        cauHoi.NoiDungTraLoi_Unicode = Trim250(dapAn_Unicode);
                        db.SaveChanges();
                        return 1;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
        }

        internal static int UpdateTitle(string maCauHoi, string tenCauHoi, string tenKhoi)
        {
            using (var db = new QLNHD_KHContext())
            {
                var cauHoi = db.CauHoiDbSet.Where(e => e.MaCauHoi == maCauHoi).SingleOrDefault();
                if (cauHoi == null)
                    return -1;
                else
                {
                    try
                    {
                        cauHoi.TenCauHoi = tenCauHoi;
                        cauHoi.Khoi.TenKhoi = tenKhoi;
                        db.SaveChanges();
                        return 1;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
        }

        internal static int UpdateKhoi(string maCauHoi, string maKhoi)
        {
            using (var db = new QLNHD_KHContext())
            {
                var cauHoi = db.CauHoiDbSet.Where(e => e.MaCauHoi == maCauHoi).SingleOrDefault();
                if (cauHoi == null)
                    return -1;
                else
                {
                    try
                    {
                        cauHoi.MaKhoi = maKhoi;
                        db.SaveChanges();
                        return 1;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
        }


        internal static List<GridCauHoiForQuanLy> GetListCauHoi(HocPhan hocPhan, int vaitro)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                if (hocPhan == null)
                    return null;
                //TODO:
                //Sắp xếp e.TenCauHoi theo kiểu số chứ không phải theo kiểu ký tự, 1.10 > 1.2
                if (vaitro == (int)QuanLyNganHangDe.DAL.Models.NguoiSuDung.VAITRO.QuanTriHeThong)
                {
                    var ds = from e in context.CauHoiDbSet
                             where e.Khoi.HocPhan.MaHocPhan == hocPhan.MaHocPhan
                             orderby e.Khoi.Stt, e.Khoi.TenKhoi, e.TenCauHoi
                             select new GridCauHoiForQuanLy
                             {
                                 Diem = e.Khoi.SoDiem,
                                 MaCauHoi = e.MaCauHoi,
                                 NoiDung = e.NoiDungCauHoi_Unicode,
                                 TenCauHoi = e.TenCauHoi,
                                 TenKhoi = e.Khoi.TenKhoi,
                                 SoLanDaDung = e.DeInRaCollection.Count,
                                 ConSuDung = e.ConSuDung,
                                 NoiDung_RTF = e.NoiDungCauHoi_RTF,
                                 DapAn_RTF = e.NoiDungTraLoi_RTF,
                                 SttKhoi = e.Khoi.Stt
                             };
                    return ds.ToList();
                }
                else
                {
                    var ds = from e in context.CauHoiDbSet
                             where e.Khoi.HocPhan.MaHocPhan == hocPhan.MaHocPhan && e.ConSuDung == true
                             orderby e.Khoi.Stt, e.Khoi.TenKhoi, e.TenCauHoi
                             select new GridCauHoiForQuanLy
                             {
                                 Diem = e.Khoi.SoDiem,
                                 MaCauHoi = e.MaCauHoi,
                                 NoiDung = e.NoiDungCauHoi_Unicode,
                                 TenCauHoi = e.TenCauHoi,
                                 TenKhoi = e.Khoi.TenKhoi,
                                 SoLanDaDung = e.DeInRaCollection.Count,
                                 ConSuDung = true
                             };

                    return ds.ToList();
                }
            }
        }

        internal static int XoaCauHoi(string maCauHoi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var ch = (from e in context.CauHoiDbSet
                          where e.MaCauHoi == maCauHoi
                          select e).FirstOrDefault();
                if (ch != null)
                {
                    var maKhoi = ch.MaKhoi;
                    if (ch.ConSuDung)
                    {
                        ch.ConSuDung = false;
                        context.SaveChanges();
                    }
                    else
                    {
                        if (ch.DeInRaCollection == null || ch.DeInRaCollection.Count == 0)
                        {
                            context.CauHoiDbSet.Remove(ch);
                            context.SaveChanges();
                        }
                        else
                            return -1;
                    }
                    var phan = (from e in context.KhoiDbSet
                                where e.MaKhoi == maKhoi
                                select e).SingleOrDefault();
                    if (phan != null && phan.CauHoiCollection.Count == 0)
                    {
                        context.KhoiDbSet.Remove(phan);
                        context.SaveChanges();
                    }
                    return 1;
                }
                else
                    return 0;
            }
        }

        /// <summary>
        /// Phục hồi lại những câu hỏi đã đánh dấu xóa
        /// </summary>
        /// <param name="maCauHoi"></param>
        /// <returns></returns>
        internal static bool PhucHoi(string maCauHoi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var ch = (from e in context.CauHoiDbSet
                          where e.MaCauHoi == maCauHoi
                          select e).FirstOrDefault();
                if (ch != null)
                {
                    ch.ConSuDung = true;
                    context.SaveChanges();
                    return true;
                }
                else
                    throw new Exception("Câu hỏi này không tồn tại");
            }
        }
    }
    public class GridCauHoiForQuanLy
    {
        public string MaCauHoi { get; set; }
        public string TenCauHoi { get; set; }
        public string NoiDung { get; set; }
        public string NoiDung_RTF { get; set; }
        public string DapAn_RTF { get; set; }
        public string TenKhoi { get; set; }
        public string Diem { get; set; }
        public int SoLanDaDung { get; set; }
        public string SoLanDaDungStr { get { return ConSuDung ? SoLanDaDung.ToString() : "Không còn sử dụng"; } }
        public bool ConSuDung { get; set; }
        public int SttKhoi { get; set; }
    }
}
